package com.freeter.modules.gjs.mapper;

import com.baomidou.mybatisplus.mapper.BaseMapper;
import com.freeter.modules.gjs.entity.StockStatus;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
import java.math.BigDecimal;
import java.time.LocalDateTime;

@Mapper
public interface StockStatusMapper extends BaseMapper<StockStatus> {


    List<StockStatus> selectLowStock();

    List<StockStatus> selectByProjectSiteBarcode(@Param("projectCode") String projectCode, @Param("siteId") String siteId, @Param("id") Long id);

    List<java.util.Map<String, Object>> selectAllItemList();

    List<java.util.Map<String, Object>> selectItemList(@Param("projectCode") String projectCode, @Param("siteId") String siteId, @Param("catId") String catId);

    Map<String, Object> selectItemByIdOrBarcode(@Param("projectCode") String projectCode, @Param("siteId") String siteId, @Param("id") String id, @Param("itemBarcode") String itemBarcode);

    List<java.util.Map<String, Object>> selectAllUpdatedItemList(@Param("projectCode") String projectCode, @Param("siteId") String siteId, @Param("currentLastUpdate") String currentLastUpdate);

    StockStatus selectByItemCodeAndSiteCode(@Param("itemCode") String itemCode, @Param("siteCode") String siteCode);
    
    // 新增业务逻辑处理器需要的方法
    List<Map<String, Object>> selectBySiteIdAndItemUomIdAndBarcode(@Param("siteId") Long siteId, @Param("itemUomId") Long itemUomId, @Param("itemBarcode") String itemBarcode);
    
    List<Map<String, Object>> selectBySiteIdAndItemUomIdAndBarcodeWithNullExpDate(@Param("siteId") Long siteId, @Param("itemUomId") Long itemUomId, @Param("itemBarcode") String itemBarcode);
    
    List<Map<String, Object>> selectBySiteIdAndItemUomIdAndBarcodeWithExpDate(@Param("siteId") Long siteId, @Param("itemUomId") Long itemUomId, @Param("itemBarcode") String itemBarcode);
    
    void updateLastGrById(@Param("id") Long id, @Param("lastGr") LocalDateTime lastGr);
    
    void updateStockQtyById(@Param("id") Long id, @Param("stockQty") BigDecimal stockQty);
    
    void updateStockQtyAndHoldQtyById(@Param("id") Long id, @Param("stockQty") BigDecimal stockQty, @Param("holdQty") BigDecimal holdQty);
    
    Map<String, Object> selectByIdForUpdate(@Param("id") Long id);
    
    Long countByStockIdAndExpDate(@Param("stockId") Long stockId);

    // 新增业务逻辑处理器需要的方法
    List<Map<String, Object>> selectDamageReportInfo(@Param("reportId") Long reportId);
    
    // 查询库存状态（用于业务逻辑处理）
    List<Map<String, Object>> selectStockStatusBySiteAndItem(@Param("siteId") Long siteId, 
                                                           @Param("uomId") Long uomId, 
                                                           @Param("itemBarcode") String itemBarcode);
    
    // 查询过期日期为空的库存状态
    List<Map<String, Object>> selectStockStatusWithNullExpDate(@Param("siteId") Long siteId, 
                                                              @Param("uomId") Long uomId, 
                                                              @Param("itemBarcode") String itemBarcode);
    
    // 查询有过期日期的库存状态
    List<Map<String, Object>> selectStockStatusWithExpDate(@Param("siteId") Long siteId, 
                                                          @Param("uomId") Long uomId, 
                                                          @Param("itemBarcode") String itemBarcode);
    
    // 更新最后收货时间
    int updateLastGr(@Param("stockId") Long stockId, @Param("lastGr") LocalDateTime lastGr);
    
    // 更新库存数量
    int updateStockQuantity(@Param("stockId") Long stockId, @Param("qty") BigDecimal qty);
    
    // 更新库存和冻结数量
    int updateStockAndHoldQuantity(@Param("stockId") Long stockId, 
                                  @Param("stockQty") BigDecimal stockQty, 
                                  @Param("holdQty") BigDecimal holdQty);
    
    // 获取库存状态信息
    StockStatus selectStockStatusInfo(@Param("stockId") Long stockId);
    
    // 检查是否为新批次
    int countNewBatch(@Param("stockId") Long stockId);
} 